package com.atguigu.daijia.customer.service.impl;

import com.atguigu.daijia.common.constant.RedisConstant;
import com.atguigu.daijia.common.execption.GuiguException;
import com.atguigu.daijia.common.result.Result;
import com.atguigu.daijia.common.result.ResultCodeEnum;
import com.atguigu.daijia.common.util.AuthContextHolder;
import com.atguigu.daijia.customer.client.CustomerInfoFeignClient;
import com.atguigu.daijia.customer.service.CustomerService;
import com.atguigu.daijia.model.form.customer.UpdateWxPhoneForm;
import com.atguigu.daijia.model.vo.customer.CustomerLoginVo;
import io.netty.util.internal.StringUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import reactor.netty.http.server.HttpServerRequest;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class CustomerServiceImpl implements CustomerService {

    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private CustomerInfoFeignClient customerInfoFeignClient;

    /**
     * 用户微信登录
     * 通过调用Feign客户端使用微信登录，获取用户信息并生成登录令牌
     * @param code 用户微信登录的授权码
     * @return 登录成功的令牌字符串
     * @throws GuiguException 当登录接口调用失败或返回数据为空时抛出异常
     */
    @Override
    public String wxLogin(String code) {
        // 调用Feign客户端的登录方法，使用微信授权码获取用户信息
        Result<Long> codeResult = customerInfoFeignClient.login(code);

        // 检查登录结果码，如果不为200，则抛出异常
        if(codeResult.getCode()!=200){
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }

        // 检查登录结果中的数据是否为空，为空则抛出异常
        if(codeResult.getData()==null){
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }

        // 生成一个唯一的登录令牌，使用UUID
        String token = UUID.randomUUID().toString().replaceAll("-", "");

        // 将登录令牌和用户ID存储到Redis中，并设置过期时间
        redisTemplate.opsForValue().set(RedisConstant.USER_LOGIN_KEY_PREFIX+token,codeResult.getData().toString(),
                RedisConstant.USER_LOGIN_KEY_TIMEOUT, TimeUnit.SECONDS);

        // 返回生成的登录令牌
        return token;
    }

    /**
     * 获取用户登录信息
     *
     * @return 包含用户登录信息的CustomerLoginVo对象
     * @throws GuiguException 如果获取用户登录信息失败或数据为空
     */
    @Override
    public CustomerLoginVo getCustomerLoginInfo() {
        // 从上下文中获取当前用户ID
        Long id = AuthContextHolder.getUserId();
        // 调用Feign客户端方法，根据用户ID获取用户登录信息
        Result<CustomerLoginVo> customerLoginInfo = customerInfoFeignClient.getCustomerLoginInfo(Long.valueOf(id));

        // 如果返回码不为200，表示获取用户登录信息失败
        if(customerLoginInfo.getCode()!=200){
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }

        // 如果返回的用户登录信息为空，抛出异常
        if(customerLoginInfo.getData()==null){
            throw new GuiguException(ResultCodeEnum.DATA_ERROR);
        }

        // 返回用户登录信息
        return customerLoginInfo.getData();
    }

    @Override
    public Boolean updateWxPhoneNumber(UpdateWxPhoneForm updateWxPhoneForm) {
        updateWxPhoneForm.setCustomerId(AuthContextHolder.getUserId());
        //个人版微信公众号无法获取到用户手机号
//        customerInfoFeignClient.updateWxPhoneNumber(updateWxPhoneForm);
        return true;
    }
}
